# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from sklearn.metrics import roc_curve, auc, confusion_matrix
import seaborn as sns


def data_preprocessing(path, logger):
    """
    数据预处理：读取CSV文件并处理训练集/测试集目标列位置差异
    训练集（train.csv）目标列（Attrition）在第一列，测试集（test.csv）在最后一列
    :param path: 数据文件路径
    :param logger: 日志实例，用于记录处理过程
    :return: 处理后的DataFrame，目标列统一命名为'Attrition'
    """
    # 读取数据
    try:
        data = pd.read_csv(path)
        logger.info(f"成功读取数据文件: {path}，原始数据形状: {data.shape}")
    except Exception as e:
        logger.error(f"读取数据文件失败: {str(e)}", exc_info=True)
        raise

    # 处理目标列位置差异
    if 'train.csv' in path.lower():
        # 训练集目标列在第一列
        target_col = data.columns[0]
        if target_col != 'Attrition':
            logger.warning(f"训练集第一列列名应为'Attrition'，实际为'{target_col}'，已自动重命名")
        data = data.rename(columns={target_col: 'Attrition'})
        logger.info("训练集目标列处理完成（第一列 -> 'Attrition'）")
    elif 'test.csv' in path.lower():
        # 测试集目标列在最后一列
        target_col = data.columns[-1]
        if target_col != 'Attrition':
            logger.warning(f"测试集最后一列列名应为'Attrition'，实际为'{target_col}'，已自动重命名")
        data = data.rename(columns={target_col: 'Attrition'})
        logger.info("测试集目标列处理完成（最后一列 -> 'Attrition'）")
    else:
        logger.warning(f"未知数据集类型: {path}，未调整目标列位置")

    return data


def model_view_AUC(x_test, y_test, model):
    """绘制ROC曲线并计算AUC"""
    y_pred_proba = model.predict_proba(x_test)[:, 1]
    fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
    roc_auc = auc(fpr, tpr)

    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    plt.plot(fpr, tpr, label=f'ROC曲线 (AUC = {roc_auc:.2f})')
    plt.plot([0, 1], [0, 1], 'k--')  # 随机猜测的基准线
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('假正例率')
    plt.ylabel('真正例率')
    plt.title('ROC曲线')
    plt.legend(loc='lower right')
    plt.show()


def model_hunxiao(y_test, y_pred):
    """绘制混淆矩阵"""
    cm = confusion_matrix(y_test, y_pred)

    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
    plt.xlabel('预测值')
    plt.ylabel('真实值')
    plt.title('混淆矩阵')
    plt.show()


if __name__ == '__main__':
    # 测试数据预处理功能
    from util.logUtil import Logger

    logger = Logger('../', 'data_preprocess_test').get_logger()
    data = data_preprocessing(r'../data/train.csv', logger)
    print(f"测试数据预处理结果：\n{data.head(3)}")